/**
 * 在爬网网站时，您可能会遇到想要保存的某些资源，但不需要爬网程序的全部功能来执行此操作（例如通过 CDN 传递的图像）。
 * 通过将该Request#skipNavigation选项与结合使用sendRequest，我们可以从 CDN 获取图像，并将其保存到我们的键值存储中，而无需使用完整的爬虫。
 */
import { PlaywrightCrawler, KeyValueStore } from 'crawlee';

// 为我们找到的所有图像创建一个键值存储
const imageStore = await KeyValueStore.open('images');

const crawler = new PlaywrightCrawler({
    async requestHandler({ request, page, sendRequest }) {
        // 该请求应该跳过导航
        if (request.skipNavigation) {
            // 请求图像并取回其缓冲区
            const imageResponse = await sendRequest({ responseType: 'buffer' });

            // 将图像保存在键值存储中
            await imageStore.setValue(`${request.userData.key}.png`, imageResponse.body);

            // 防止执行其余代码，因为我们不需要它
            return;
        }

        // 获取当前页面所有图片源
        const images = await page.$$eval('img', (imgs) => imgs.map((img) => img.src));

        // 添加所有的url作为爬虫的请求，给每个图片一个key
        await crawler.addRequests(images.map((url, i) => ({ url, skipNavigation: true, userData: { key: i } })));
    },
});

await crawler.addRequests(['https://crawlee.dev']);

// 运行爬行器
await crawler.run();
